`ifndef CACHE_DEFINES_H
`define CACHE_DEFINES_H

`define HIT     1'b1    //cache命中
`define MISS    1'b0    //cache缺失

`define TAGBITNUM         20       //Tag位      addr[31:12]
`define INDEXBITNUM       8        //索引位     addr[11:4]
`define OFFSETNUM         4        //offset位   addr[3:0]    一个cache line contains 16words
`define WordsPerCacheLine 4       //每个cache line 4 words

//-----------CPU到icache的连线
interface CPU_IBus_Interface();
  logic     valid;     //  1'b1:CPU发出访存的请求
  //logic         ready;     //  1'b1:CPU可以接收访存结果
  logic [19:0]  tag;
  logic [7:0]   index;     // 
  logic [3:0]   offset;    //  
  logic [31:0]  rdata;     //  读cache时有效，返回的数据
  logic         busy;     //
  logic         stall;
  logic         isCache;//保留给tlb的

  modport master ( //cpu的接口
            output  valid,index,tag,
            output  offset,stall,isCache,
            input   busy,rdata
          );

  modport slave ( //cache的接口
            input  valid,index,tag,
            input  offset,stall,isCache,
            output   busy,rdata
          );

endinterface

//-----------CPU到Dcache的连线
interface CPU_DBus_Interface();
  logic     valid;     //  1'b1:CPU发出访存的请求
  //logic         ready;     //  1'b1:CPU可以接收访存结果
  logic     op;        //  0 读 1 写
  logic [19:0]  tag;
  logic [7:0]   index;     // 
  logic [3:0]   offset;    //  
  logic [3:0]   wstrb;     //  CPU向主存(cache)写使能    ----Icache 用不到
  logic [2:0]   storeType; //  存储类型 000:byte_zero  001:byte_sign  010:half_zero  011 half_sign  100:word
                           /*    `define byte_zero   3'b000 
                                 `define byte_sign   3'b001
                                 `define half_zero   3'b010
                                 `define half_sign   3'b011
                                 `define word        3'b100    */


  logic [31:0]  wdata;     //  向主存写的数据       ------Icache 用不到
  logic [31:0]  rdata;     //  读cache时有效，返回的数据
  logic         busy;     //when "busy" is 0, cache is already to recive new request
  logic         stall;    //cache is already but CPU is being stall
  logic         isCache;//保留给tlb的

  modport master ( //cpu的接口
            output  valid,op,index,tag,
            output  offset,wstrb,wdata,storeType,stall,isCache,
            input busy,rdata
          );

  modport slave ( //cache的接口
            input  valid,op,index,tag,
            input  offset,wstrb,wdata,storeType,stall,isCache,
            output busy,rdata
          );

endinterface

//icache到AXI的连线
interface AXI_IBus_Interface();
  //读请求通道
  logic 					rd_req;    // 未命中发请求

  logic[31:0]     rd_addr;   // 地址
  logic           rd_rdy;    // 空闲时给ready
  //读返回通道
  logic           ret_valid; // 突发读完一次之后（缓冲区满了）

  logic[127:0]     ret_data; // 数据

  modport master ( //cache的接口
            output  rd_req,rd_addr,
            input rd_rdy,ret_valid,ret_data
          );

  modport slave ( //axi模块的接口
            input  rd_req,rd_addr,
            output rd_rdy,ret_valid,ret_data
          );

endinterface

//dcache到AXI的连线
interface AXI_DBus_Interface();
    //读请求通道 cache读主存
    logic       rd_req;    //读请求有效信号 1:有效 cache MISS时 向主存发送
    logic[31:0]     rd_addr;   //读请求的地址
    logic           rd_rdy;    //AXI给cache的信号  读请求是否能被接受的握手信号 高电平有效

    //读返回通道 主存写cache
    logic           ret_valid;  // 1:主存返回的数据有效 
    logic[127:0]    ret_data;   // 主存返回的数据 4 words

    //写请求通道 cache往主存写
    logic           wr_req;     // 写请求有效dcache store未命中时或脏位line需要替换时进行写请求 高电平有效
    logic[31:0]     wr_addr;    // 写地址 

    logic[127:0]    wr_data;    // 写数据 一次写一组 4 words
    logic           wr_rdy;     // 当cache收到这个信号表示AXI准备好接受数据 1：有效 当AXI的16字节缓存为空时有效

    //写返回通道
    logic           wr_valid;   //表示已经写入
  modport master ( //cache的接口
            output  rd_req,rd_addr,
            output  wr_req,wr_addr,wr_data,
            input rd_rdy,ret_valid,ret_data,wr_rdy,wr_valid
          );

  modport slave ( //axi模块的接口
            input  rd_req,rd_addr,
            input  wr_req,wr_addr,wr_data,
            output rd_rdy,ret_valid,ret_data,wr_rdy,wr_valid
          );

endinterface

interface AXI_UICACHE_Interface();
  //读请求通道
  logic           rd_req;
  logic[31:0]     rd_addr;
  logic           rd_rdy;
  logic [2:0]     LoadType;  
  //读返回通道
  logic           ret_valid;
  logic[31:0]     ret_data;

  modport master (//cache端口
  output rd_req,rd_addr,LoadType,
  input rd_rdy,ret_valid,ret_data
  );

  modport slave (//axi端口
  input rd_req,rd_addr,LoadType,
  output rd_rdy,ret_valid,ret_data
  );
endinterface

interface AXI_UDCACHE_Interface();
  //读请求通道
  logic           rd_req;
  logic[31:0]     rd_addr;
  logic           rd_rdy;
  logic [2:0]     LoadType;
  //读返回通道
  logic           ret_valid;
  logic[31:0]     ret_data;
  //写请求通道
  logic           wr_req;
  logic[31:0]     wr_addr;
  logic[31:0]     wr_data;
  logic [3:0]     wr_wstrb;
  logic           wr_rdy;
  //写返回通道
  logic           wr_valid;

  modport master (//cache端口
  output rd_req,rd_addr,LoadType,
  output wr_req,wr_addr,wr_data,wr_wstrb,
  input rd_rdy,ret_valid,ret_data,wr_rdy,wr_valid
  );

  modport slave (//axi端口
  input rd_req,rd_addr,LoadType,
  input wr_req,wr_addr,wr_data,wr_wstrb,
  output rd_rdy,ret_valid,ret_data,wr_rdy,wr_valid
  );
endinterface

`endif